package com.hspedu.qqclient.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.ArrayList;

/**
 * @Author Stringzhua
 * @Date 2024/4/10 21:25
 * description:
 */
public class ClientConnectServerThread extends Thread {
    //该线程需要持有Socket
    private Socket socket;

    //构造器可以接收一个Socket对象
    public ClientConnectServerThread(Socket socket) {
        this.socket = socket;
    }

    //为了更方便得到Socket
    public Socket getSocket() {
        return socket;
    }

    //    @Override
//    public void run() {
//        //因为Thread需要在后台和服务器通讯,因此我们用一个while循环
//        while (true) {
//            //读取服务器回送的消息
//            try {
//                System.out.println("客户端线程,等待读取从服务器端发送的消息");
//                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
//                Message message = (Message) ois.readObject();
//                //如果服务器没有发送Message对象,线程会阻塞在这里
//                //判断这个message的类型,然后做相应的类型处理
//                //如果读取到的是服务端返回的在线用户列表
//                if (message.getMessageType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {
//                    //取出在线列表信息,并显示
//                    //规定:
//                    String[] onlineUsers = message.getContent().split(" ");
//                    System.out.println("\n========当前在线用户列表如下========");
//                    for (int i = 0; i < onlineUsers.length; i++) {
//                        System.out.println("用户: " + onlineUsers[i]);
//                    }
//                } else if (message.getMessageType().equals(MessageType.MESSAGE_COMM_MES)) {//普通聊天消息
//                    //把从服务器转发的消息,显示到控制台即可
//                    System.out.print("发送时间:" + message.getSendTime());
//                    System.out.println("\n" + message.getSender() + " 对 " + message.getGetter() + " 说 " + message.getContent());
//                } else if (message.getMessageType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
//                    //显示在客户端的控制台即可
//                    System.out.print("发送时间:" + message.getSendTime());
//                    System.out.println("\n" + message.getSender() + " 对大家说 " + message.getContent());
//                } else if (message.getMessageType().equals(MessageType.MESSAGE_FILE_MES)) {
//                    //如果含有文件的消息
//                    //让用户指定保存路径......
//                    System.out.println("\n" + message.getSender() + " 给 " + message.getGetter() +
//                            " 发送文件: " + message.getSrc() + " 到我的电脑的目录 " + message.getDest());
//                    //取出message的文件字节数组,通过文件输出流写出到磁盘
//                    FileOutputStream fileOutputStream = new FileOutputStream(message.getDest());
//                    fileOutputStream.write(message.getFileBytes());
//                    fileOutputStream.close();
//                    System.out.println("\n保存文件成功!~");
//                } else {
//                    System.out.print("发送时间:" + message.getSendTime());
//                    System.out.println("是其他类型的message,暂时不处理");
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
    //TODO:客户端新增代码 发送离线消息
    @Override
    public void run() {
        //因为需要在后台和服务器通讯，因此做成while循环
        while (true) {
            try {
                System.out.println("客户端线程等待读取服务器端发送的消息");
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                //处理读入的对象
                Object o = ois.readObject();//如果服务器没有发送object对象,线程会阻塞在这里
                if (o instanceof ArrayList) {
                    ArrayList<Message> messageArrayList = (ArrayList<Message>) o;
                    System.out.println("以下是您的离线消息：⬇");
                    for (Message message : messageArrayList) {
                        System.out.println(message.getSender() + ": " + message.getContent() + " time:" + message.getSendTime());
                    }
                } else {
                    Message message = (Message) o;
                    //判断message类型 然后做相应的业务处理
                    //如果读取到的式服务得到的返回在线用户列表
                    if (message.getMessageType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {
                        //取出在线列表信息，并显示
                        String[] onlineUsers = message.getContent().split(" ");
                        System.out.println("========当前在线用户列表========");
                        for (int i = 0; i < onlineUsers.length; i++) {
                            System.out.println("用户：" + onlineUsers[i]);
                        }
                    } else if (message.getMessageType().equals(MessageType.MESSAGE_COMM_MES)) {//普通的聊天消息
                        //把服务端转化的消息显示到控制台即可
                        System.out.println("\n" + message.getSender() + "对" + message.getGetter() + "说" + message.getContent());
                    } else if (message.getMessageType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
                        //显示在客户端的控制台
                        System.out.println("\n" + message.getSender() + "对大家说" + message.getContent());
                    } else if (message.getMessageType().equals(MessageType.MESSAGE_FILE_MES)) {
                        System.out.println("\n" + message.getSender() + "给" + message.getGetter() + "发送文件" + message.getSrc() + "到我的点啊弄目录" + message.getDest());
                        //取出message的字节数组 通过文件输出流写出到磁盘
                        FileOutputStream fileOutputStream = new FileOutputStream(message.getDest());
                        fileOutputStream.write(message.getFileBytes());
                        fileOutputStream.close();
                        System.out.println("\n保存文件成功");
                    } else {
                        System.out.println("是其他类型的message");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
